package demo2

import "fmt"

/*
  struct 结构
    1. 在结构体中我们可以为不同项定义不同的数据类型。
		2. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
		3. 结构体定义需要使用 type 和 struct 语句。
				struct 语句定义一个新的数据类型，结构体有中有一个或多个成员。type 语句设定了结构体的名称。
		4. struct 类似于 java 中的类，可以在 struct 中定义成员变量。
				4.1 通过 struct 变量 .成员 变量来访问。
				4.2 通过 struct 指针 .成员 变量来访问。
		5. 不需要通过 getter, setter 来设置访问权限。
		type Rect struct{   //定义矩形类
			x,y float64       //类型只包含属性，并没有方法
			width,height float64
		}
*/

// Student 学生
type Student struct {
	name  string
	age   int
	Class string
}

// Books 课本
type Books struct {
	title   string
	author  string
	subject string
	bookid  int
}

/*
	struct 的使用方式1
	  1. 直接通过 . 操作符使用
*/
func printBooks(book Books) {
	fmt.Printf("Books title: %s\n", book.title)
	fmt.Printf("Books author: %s\n", book.author)
	fmt.Printf("Books subject: %s\n", book.subject)
	fmt.Printf("Books bookid: %d\n", book.bookid)
}

/*
	struct 的使用方式2
	  1. 通过结构体的指针访问结构体的实现
*/
func printBooks2(book *Books) {
	fmt.Printf("Books title: %s\n", book.title)
	fmt.Printf("Books author: %s\n", book.author)
	fmt.Printf("Books subject: %s\n", book.subject)
	fmt.Printf("Books bookid: %d\n", book.bookid)
}

// TestDemo24 struct 结构
func TestDemo24() {
	// demo1 -- 基本使用
	var stud1 Student
	stud1.name = "admin"
	stud1.age = 22
	stud1.Class = "class1"
	fmt.Println(stud1.name)
	fmt.Println(stud1.age)
	fmt.Println(stud1.Class)

	var stud2 = new(Student)
	// var stud2 *Student = new(Student)
	stud2.name = "member"
	stud2.age = 33
	fmt.Println(stud2.name, (*stud2).name)

	// demo2
	var Book1 Books /* 声明 Book1 为 Books 类型 */
	var Book2 Books /* 声明 Book2 为 Books 类型 */

	/* book 1 描述 */
	Book1.title = "Go 语言"
	Book1.author = "www.runoob.com"
	Book1.subject = "Go 语言教程"
	Book1.bookid = 6495407

	/* book 2 描述 */
	Book2.title = "Python 教程"
	Book2.author = "www.runoob.com"
	Book2.subject = "Python 语言教程"
	Book2.bookid = 6495700

	// /* 打印 Book1 信息 */
	// fmt.Printf("Book 1 title : %s\n", Book1.title)
	// fmt.Printf("Book 1 author : %s\n", Book1.author)
	// fmt.Printf("Book 1 subject : %s\n", Book1.subject)
	// fmt.Printf("Book 1 bookid : %d\n", Book1.bookid)

	// /* 打印 Book2 信息 */
	// fmt.Printf("Book 2 title : %s\n", Book2.title)
	// fmt.Printf("Book 2 author : %s\n", Book2.author)
	// fmt.Printf("Book 2 subject : %s\n", Book2.subject)
	// fmt.Printf("Book 2 bookid : %d\n", Book2.bookid)

	fmt.Println("通过结构体直接访问属性")
	printBooks(Book1)
	printBooks(Book2)

	fmt.Println("通过结构体指针访问属性")
	printBooks2(&Book1)
	printBooks2(&Book2)

}
